package net.loyintean.pearlshell.validation.rule;

import net.loyintean.pearlshell.validation.IValidRuleConfig;

class StringMaxLengthValidRuleImpl extends AbstractStringValidRuleImpl
		implements INeedAdditionConfig {

	StringMaxLengthValidRuleImpl() {
		super();
	}

	@Override
	protected boolean validString(String toValid, IValidRuleConfig config) {

		// 这个方法确保了config中配置参数的合法性。
		// 如果不合法，将抛出异常。
		isValidParamIllegal(config);

		int maxLength = (Integer) config.validParam()[0];

		return toValid.length() <= maxLength;
	}

	@Override
	public String errorMsg(IValidRuleConfig config) {
		isValidParamIllegal(config);

		return "最大长度为" + config.validParam()[0];
	}

	/**
	 * 判断校验参数是否不合法。
	 * <p>
	 * 合法是指：<br>
	 * config非null<br>
	 * && config.validParam() != null<br>
	 * && config.validParam().length > 0<br>
	 * && config.validParam()[0] != null<br>
	 * && config.validParam()[0] instanceof Integer
	 * 
	 * @param config
	 *            必须保证config.validParam()[0]是一个整数。否则将判定为不合法
	 * @throws IllegalArgumentException
	 *             如果参数不合法，则将抛出此异常。该异常无法由当前rule处理，只能抛给上层。
	 */
	@Override
	public void isValidParamIllegal(IValidRuleConfig config)
			throws IllegalArgumentException {

		try {

			if (!(config.validParam()[0] instanceof Integer)) {
				throw new NullPointerException();
			}

		} catch (NullPointerException e) {
			// 用这个空指针异常来捕捉：
			// config == null || config.validParam() == null
			// || config.validParam().length == null
			// 以及try里面处理过的!(config.validParam()[0] instanceof Integer)

			throw new IllegalArgumentException("没有指定字符串最大长度校验所需的‘最大长度值’！", e);
			// 其它异常概不处理。
		}

	}
}
